package com.ctsi.commons.util;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 测试使用
 * @author yueming
 *
 */
public class XMLToString {

	public static String nodeToString(Node node) {
		StringBuilder xml = new StringBuilder(256);
		XMLToString.nodeToString(xml, node);
		return xml.toString();
	}

	public static void nodeToString(StringBuilder xml, Node root) {
		// 定义要返回的根节点
		String name = root.getNodeName();
		// 获得该节点的NodeName
		String value = root.getNodeValue();
		appentLeftTag(xml, name, root);

		// 如果为值节点，那么取得该节点的值，否则取得该节点的Tag的名字
		if (root.hasChildNodes())
		// 如果该节点有孩子节点，那么递归处理该节点的孩子节点
		{
			NodeList children = root.getChildNodes();
			// 取得该节点的子节点列表
			if (children != null) {
				// 判断子节点是否为空
				int numChildren = children.getLength();
				// 取得字节数目
				for (int i = 0; i < numChildren; i++) {
					Node node = children.item(i);
					// 循环处理每个子节点
					if (node != null) {
						if (node.getNodeType() == Node.ELEMENT_NODE) {
							nodeToString(xml, node);
							// 如果该子节点还有孩子节点使用递归的方法处理该子节点
						} else {
							String data = node.getNodeValue();
							if (data != null) {
								xml.append(data);
							}
						}
					}
				}
			}
		}
		if (UtilValidate.isNotEmpty(value)) {
			xml.append(value);
		}
		appentRightTag(xml, name);

	}

	private static void appentLeftTag(StringBuilder xml, String tagName, Node node) {
		xml.append('<').append(tagName);
		NamedNodeMap attrs = node.getAttributes();
		if (attrs != null && attrs.getLength() > 0) {
			for (int i = 0; i < attrs.getLength(); i++) {
				xml.append(' ');
				xml.append(attrs.item(i).getNodeName());
				xml.append('=');
				xml.append('\"');
				xml.append(attrs.item(i).getNodeValue());
				xml.append('\"');

			}
		}
		xml.append('>');
	}

	private static void appentRightTag(StringBuilder xml, String tagName) {
		xml.append("</").append(tagName).append('>');
	}
}
